package org.yelongframework.servlet;

import java.io.IOException;

import javax.servlet.ServletRequest;

/**
 * {@link ServletRequest}支持
 * 
 * @since 1.0.0
 */
public interface ServletRequestSupport {

	// ==================================================获取参数==================================================

	/**
	 * 获取参数，如果参数不存在则返回默认值
	 * 
	 * @param request      请求
	 * @param name         参数名称
	 * @param defaultValue 默认值
	 * @return 参数值，如果不存在则返回默认值
	 */
	String getParameter(ServletRequest request, String name, String defaultValue);

	/**
	 * 获取参数的值并转换为{@link Integer}
	 * 
	 * @param request 请求
	 * @param name    参数名称
	 * @return 参数值，如果不存在则返回null，否则转换为 {@link Integer}
	 * @see Integer#valueOf(String)
	 */
	Integer getParameterInteger(ServletRequest request, String name);

	/**
	 * 获取参数值并转换为{@link Integer}，如果值不存在则返回默认值
	 * 
	 * @param request      请求
	 * @param name         参数名称
	 * @param defaultValue 默认值
	 * @return 参数值，如果不存在则返回默认值，否则转换为 {@link Integer}
	 */
	Integer getParameterInteger(ServletRequest request, String name, Integer defaultValue);

	/**
	 * 获取参数值并转换为 {@link Long}，如果值不存在则返回 <code>null</code>
	 * 
	 * @param request 请求
	 * @param name    参数名称
	 * @return 参数值，如果不存在则返回 <code>null</code>， 否则转换为 {@link Long}
	 */
	Long getParameterLong(ServletRequest request, String name);

	/**
	 * 获取参数值并转换为{@link Long}，如果值不存在则返回默认值
	 * 
	 * @param request      请求
	 * @param name         参数名称
	 * @param defaultValue 默认值
	 * @return 参数值，如果不存在则返回默认值，否则转换为 {@link Long}
	 */
	Long getParameterLong(ServletRequest request, String name, Long defaultValue);

	/**
	 * 获取参数值并转换为 {@link Boolean}，如果值不存在则返回 <code>null</code>
	 * 
	 * @param request 请求
	 * @param name    参数名称
	 * @return 参数值，如果不存在则返回 <code>null</code>， 否则转换为 {@link Boolean}
	 */
	Boolean getParameterBoolean(ServletRequest request, String name);

	/**
	 * 获取参数值并转换为{@link Boolean}，如果值不存在则返回默认值
	 * 
	 * @param request      请求
	 * @param name         参数名称
	 * @param defaultValue 默认值
	 * @return 参数值，如果不存在则返回默认值，否则转换为 {@link Boolean}
	 */
	Boolean getParameterBoolean(ServletRequest request, String name, Boolean defaultValue);

	/**
	 * 获取参数映射字符串
	 * 
	 * @param request 请求
	 * @return 请求参数字符串
	 */
	String getParameterMapString(ServletRequest request);

	// ==================================================获取消息体==================================================

	/**
	 * 读取请求消息体
	 * 
	 * @param request 请求
	 * @return 请求消息体
	 * @throws IOException IO异常
	 */
	byte[] readBodyByteArray(ServletRequest request) throws IOException;

	/**
	 * 读取请求消息体
	 * 
	 * @param request 请求
	 * @return 请求消息体
	 * @throws IOException IO异常
	 */
	String readBodyString(ServletRequest request) throws IOException;

}
